/*
 * SpanDSP - a series of DSP components for telephony
 *
 * complex_dds.c
 *
 * Written by Steve Underwood <steveu@coppice.org>
 *
 * Copyright (C) 2003 Steve Underwood
 *
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License version 2.1,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

/*! \file */

#if defined(HAVE_CONFIG_H)
#include "config.h"
#endif

#include <stdio.h>
#include <inttypes.h>
#if defined(HAVE_TGMATH_H)
#include <tgmath.h>
#endif
#if defined(HAVE_MATH_H)
#include <math.h>
#endif
#include "floating_fudge.h"

#include "spandsp/telephony.h"
#include "spandsp/complex.h"
#include "spandsp/dds.h"

#define SLENK       11
#define SINELEN     (1 << SLENK)

/* Precreating this table allows it to be in const memory, which might
   have some performance advantage. */
static const float sine_table[SINELEN] =
{
     0.00000000f,
     0.00306796f,
     0.00613588f,
     0.00920375f,
     0.01227154f,
     0.01533921f,
     0.01840673f,
     0.02147408f,
     0.02454123f,
     0.02760815f,
     0.03067480f,
     0.03374117f,
     0.03680722f,
     0.03987293f,
     0.04293826f,
     0.04600318f,
     0.04906767f,
     0.05213170f,
     0.05519524f,
     0.05825826f,
     0.06132074f,
     0.06438263f,
     0.06744392f,
     0.07050457f,
     0.07356456f,
     0.07662386f,
     0.07968244f,
     0.08274026f,
     0.08579731f,
     0.08885355f,
     0.09190896f,
     0.09496350f,
     0.09801714f,
     0.10106986f,
     0.10412163f,
     0.10717242f,
     0.11022221f,
     0.11327095f,
     0.11631863f,
     0.11936521f,
     0.12241068f,
     0.12545498f,
     0.12849811f,
     0.13154003f,
     0.13458071f,
     0.13762012f,
     0.14065824f,
     0.14369503f,
     0.14673047f,
     0.14976453f,
     0.15279719f,
     0.15582840f,
     0.15885814f,
     0.16188639f,
     0.16491312f,
     0.16793829f,
     0.17096189f,
     0.17398387f,
     0.17700422f,
     0.18002290f,
     0.18303989f,
     0.18605515f,
     0.18906866f,
     0.19208040f,
     0.19509032f,
     0.19809841f,
     0.20110463f,
     0.20410897f,
     0.20711138f,
     0.21011184f,
     0.21311032f,
     0.21610680f,
     0.21910124f,
     0.22209362f,
     0.22508391f,
     0.22807208f,
     0.23105811f,
     0.23404196f,
     0.23702361f,
     0.24000302f,
     0.24298018f,
     0.24595505f,
     0.24892761f,
     0.25189782f,
     0.25486566f,
     0.25783110f,
     0.26079412f,
     0.26375468f,
     0.26671276f,
     0.26966833f,
     0.27262136f,
     0.27557182f,
     0.27851969f,
     0.28146494f,
     0.28440754f,
     0.28734746f,
     0.29028468f,
     0.29321916f,
     0.29615089f,
     0.29907983f,
     0.30200595f,
     0.30492923f,
     0.30784964f,
     0.31076715f,
     0.31368174f,
     0.31659338f,
     0.31950203f,
     0.32240768f,
     0.32531029f,
     0.32820984f,
     0.33110631f,
     0.33399965f,
     0.33688985f,
     0.33977688f,
     0.34266072f,
     0.34554132f,
     0.34841868f,
     0.35129276f,
     0.35416353f,
     0.35703096f,
     0.35989504f,
     0.36275572f,
     0.36561300f,
     0.36846683f,
     0.37131719f,
     0.37416406f,
     0.37700741f,
     0.37984721f,
     0.38268343f,
     0.38551605f,
     0.38834505f,
     0.39117038f,
     0.39399204f,
     0.39680999f,
     0.39962420f,
     0.40243465f,
     0.40524131f,
     0.40804416f,
     0.41084317f,
     0.41363831f,
     0.41642956f,
     0.41921689f,
     0.42200027f,
     0.42477968f,
     0.42755509f,
     0.43032648f,
     0.43309382f,
     0.43585708f,
     0.43861624f,
     0.44137127f,
     0.44412214f,
     0.44686884f,
     0.44961133f,
     0.45234959f,
     0.45508359f,
     0.45781330f,
     0.46053871f,
     0.46325978f,
     0.46597650f,
     0.46868882f,
     0.47139674f,
     0.47410021f,
     0.47679923f,
     0.47949376f,
     0.48218377f,
     0.48486925f,
     0.48755016f,
     0.49022648f,
     0.49289819f,
     0.49556526f,
     0.49822767f,
     0.50088538f,
     0.50353838f,
     0.50618665f,
     0.50883014f,
     0.51146885f,
     0.51410274f,
     0.51673180f,
     0.51935599f,
     0.52197529f,
     0.52458968f,
     0.52719913f,
     0.52980362f,
     0.53240313f,
     0.53499762f,
     0.53758708f,
     0.54017147f,
     0.54275078f,
     0.54532499f,
     0.54789406f,
     0.55045797f,
     0.55301671f,
     0.55557023f,
     0.55811853f,
     0.56066158f,
     0.56319934f,
     0.56573181f,
     0.56825895f,
     0.57078075f,
     0.57329717f,
     0.57580819f,
     0.57831380f,
     0.58081396f,
     0.58330865f,
     0.58579786f,
     0.58828155f,
     0.59075970f,
     0.59323230f,
     0.59569930f,
     0.59816071f,
     0.60061648f,
     0.60306660f,
     0.60551104f,
     0.60794978f,
     0.61038281f,
     0.61281008f,
     0.61523159f,
     0.61764731f,
     0.62005721f,
     0.62246128f,
     0.62485949f,
     0.62725182f,
     0.62963824f,
     0.63201874f,
     0.63439328f,
     0.63676186f,
     0.63912444f,
     0.64148101f,
     0.64383154f,
     0.64617601f,
     0.64851440f,
     0.65084668f,
     0.65317284f,
     0.65549285f,
     0.65780669f,
     0.66011434f,
     0.66241578f,
     0.66471098f,
     0.66699992f,
     0.66928259f,
     0.67155895f,
     0.67382900f,
     0.67609270f,
     0.67835004f,
     0.68060100f,
     0.68284555f,
     0.68508367f,
     0.68731534f,
     0.68954054f,
     0.69175926f,
     0.69397146f,
     0.69617713f,
     0.69837625f,
     0.70056879f,
     0.70275474f,
     0.70493408f,
     0.70710678f,
     0.70927283f,
     0.71143220f,
     0.71358487f,
     0.71573083f,
     0.71787005f,
     0.72000251f,
     0.72212819f,
     0.72424708f,
     0.72635916f,
     0.72846439f,
     0.73056277f,
     0.73265427f,
     0.73473888f,
     0.73681657f,
     0.73888732f,
     0.74095113f,
     0.74300795f,
     0.74505779f,
     0.74710061f,
     0.74913639f,
     0.75116513f,
     0.75318680f,
     0.75520138f,
     0.75720885f,
     0.75920919f,
     0.76120239f,
     0.76318842f,
     0.76516727f,
     0.76713891f,
     0.76910334f,
     0.77106052f,
     0.77301045f,
     0.77495311f,
     0.77688847f,
     0.77881651f,
     0.78073723f,
     0.78265060f,
     0.78455660f,
     0.78645521f,
     0.78834643f,
     0.79023022f,
     0.79210658f,
     0.79397548f,
     0.79583690f,
     0.79769084f,
     0.79953727f,
     0.80137617f,
     0.80320753f,
     0.80503133f,
     0.80684755f,
     0.80865618f,
     0.81045720f,
     0.81225059f,
     0.81403633f,
     0.81581441f,
     0.81758481f,
     0.81934752f,
     0.82110251f,
     0.82284978f,
     0.82458930f,
     0.82632106f,
     0.82804505f,
     0.82976123f,
     0.83146961f,
     0.83317016f,
     0.83486287f,
     0.83654773f,
     0.83822471f,
     0.83989379f,
     0.84155498f,
     0.84320824f,
     0.84485357f,
     0.84649094f,
     0.84812034f,
     0.84974177f,
     0.85135519f,
     0.85296060f,
     0.85455799f,
     0.85614733f,
     0.85772861f,
     0.85930182f,
     0.86086694f,
     0.86242396f,
     0.86397286f,
     0.86551362f,
     0.86704625f,
     0.86857071f,
     0.87008699f,
     0.87159509f,
     0.87309498f,
     0.87458665f,
     0.87607009f,
     0.87754529f,
     0.87901223f,
     0.88047089f,
     0.88192126f,
     0.88336334f,
     0.88479710f,
     0.88622253f,
     0.88763962f,
     0.88904836f,
     0.89044872f,
     0.89184071f,
     0.89322430f,
     0.89459949f,
     0.89596625f,
     0.89732458f,
     0.89867447f,
     0.90001589f,
     0.90134885f,
     0.90267332f,
     0.90398929f,
     0.90529676f,
     0.90659570f,
     0.90788612f,
     0.90916798f,
     0.91044129f,
     0.91170603f,
     0.91296219f,
     0.91420976f,
     0.91544872f,
     0.91667906f,
     0.91790078f,
     0.91911385f,
     0.92031828f,
     0.92151404f,
     0.92270113f,
     0.92387953f,
     0.92504924f,
     0.92621024f,
     0.92736253f,
     0.92850608f,
     0.92964090f,
     0.93076696f,
     0.93188427f,
     0.93299280f,
     0.93409255f,
     0.93518351f,
     0.93626567f,
     0.93733901f,
     0.93840353f,
     0.93945922f,
     0.94050607f,
     0.94154407f,
     0.94257320f,
     0.94359346f,
     0.94460484f,
     0.94560733f,
     0.94660091f,
     0.94758559f,
     0.94856135f,
     0.94952818f,
     0.95048607f,
     0.95143502f,
     0.95237501f,
     0.95330604f,
     0.95422810f,
     0.95514117f,
     0.95604525f,
     0.95694034f,
     0.95782641f,
     0.95870347f,
     0.95957151f,
     0.96043052f,
     0.96128049f,
     0.96212140f,
     0.96295327f,
     0.96377607f,
     0.96458979f,
     0.96539444f,
     0.96619000f,
     0.96697647f,
     0.96775384f,
     0.96852209f,
     0.96928124f,
     0.97003125f,
     0.97077214f,
     0.97150389f,
     0.97222650f,
     0.97293995f,
     0.97364425f,
     0.97433938f,
     0.97502535f,
     0.97570213f,
     0.97636973f,
     0.97702814f,
     0.97767736f,
     0.97831737f,
     0.97894818f,
     0.97956977f,
     0.98018214f,
     0.98078528f,
     0.98137919f,
     0.98196387f,
     0.98253930f,
     0.98310549f,
     0.98366242f,
     0.98421009f,
     0.98474850f,
     0.98527764f,
     0.98579751f,
     0.98630810f,
     0.98680940f,
     0.98730142f,
     0.98778414f,
     0.98825757f,
     0.98872169f,
     0.98917651f,
     0.98962202f,
     0.99005821f,
     0.99048508f,
     0.99090264f,
     0.99131086f,
     0.99170975f,
     0.99209931f,
     0.99247953f,
     0.99285041f,
     0.99321195f,
     0.99356414f,
     0.99390697f,
     0.99424045f,
     0.99456457f,
     0.99487933f,
     0.99518473f,
     0.99548076f,
     0.99576741f,
     0.99604470f,
     0.99631261f,
     0.99657115f,
     0.99682030f,
     0.99706007f,
     0.99729046f,
     0.99751146f,
     0.99772307f,
     0.99792529f,
     0.99811811f,
     0.99830154f,
     0.99847558f,
     0.99864022f,
     0.99879546f,
     0.99894129f,
     0.99907773f,
     0.99920476f,
     0.99932238f,
     0.99943060f,
     0.99952942f,
     0.99961882f,
     0.99969882f,
     0.99976941f,
     0.99983058f,
     0.99988235f,
     0.99992470f,
     0.99995764f,
     0.99998118f,
     0.99999529f,
     1.00000000f,
     0.99999529f,
     0.99998118f,
     0.99995764f,
     0.99992470f,
     0.99988235f,
     0.99983058f,
     0.99976941f,
     0.99969882f,
     0.99961882f,
     0.99952942f,
     0.99943060f,
     0.99932238f,
     0.99920476f,
     0.99907773f,
     0.99894129f,
     0.99879546f,
     0.99864022f,
     0.99847558f,
     0.99830154f,
     0.99811811f,
     0.99792529f,
     0.99772307f,
     0.99751146f,
     0.99729046f,
     0.99706007f,
     0.99682030f,
     0.99657115f,
     0.99631261f,
     0.99604470f,
     0.99576741f,
     0.99548076f,
     0.99518473f,
     0.99487933f,
     0.99456457f,
     0.99424045f,
     0.99390697f,
     0.99356414f,
     0.99321195f,
     0.99285041f,
     0.99247953f,
     0.99209931f,
     0.99170975f,
     0.99131086f,
     0.99090264f,
     0.99048508f,
     0.99005821f,
     0.98962202f,
     0.98917651f,
     0.98872169f,
     0.98825757f,
     0.98778414f,
     0.98730142f,
     0.98680940f,
     0.98630810f,
     0.98579751f,
     0.98527764f,
     0.98474850f,
     0.98421009f,
     0.98366242f,
     0.98310549f,
     0.98253930f,
     0.98196387f,
     0.98137919f,
     0.98078528f,
     0.98018214f,
     0.97956977f,
     0.97894818f,
     0.97831737f,
     0.97767736f,
     0.97702814f,
     0.97636973f,
     0.97570213f,
     0.97502535f,
     0.97433938f,
     0.97364425f,
     0.97293995f,
     0.97222650f,
     0.97150389f,
     0.97077214f,
     0.97003125f,
     0.96928124f,
     0.96852209f,
     0.96775384f,
     0.96697647f,
     0.96619000f,
     0.96539444f,
     0.96458979f,
     0.96377607f,
     0.96295327f,
     0.96212140f,
     0.96128049f,
     0.96043052f,
     0.95957151f,
     0.95870347f,
     0.95782641f,
     0.95694034f,
     0.95604525f,
     0.95514117f,
     0.95422810f,
     0.95330604f,
     0.95237501f,
     0.95143502f,
     0.95048607f,
     0.94952818f,
     0.94856135f,
     0.94758559f,
     0.94660091f,
     0.94560733f,
     0.94460484f,
     0.94359346f,
     0.94257320f,
     0.94154407f,
     0.94050607f,
     0.93945922f,
     0.93840353f,
     0.93733901f,
     0.93626567f,
     0.93518351f,
     0.93409255f,
     0.93299280f,
     0.93188427f,
     0.93076696f,
     0.92964090f,
     0.92850608f,
     0.92736253f,
     0.92621024f,
     0.92504924f,
     0.92387953f,
     0.92270113f,
     0.92151404f,
     0.92031828f,
     0.91911385f,
     0.91790078f,
     0.91667906f,
     0.91544872f,
     0.91420976f,
     0.91296219f,
     0.91170603f,
     0.91044129f,
     0.90916798f,
     0.90788612f,
     0.90659570f,
     0.90529676f,
     0.90398929f,
     0.90267332f,
     0.90134885f,
     0.90001589f,
     0.89867447f,
     0.89732458f,
     0.89596625f,
     0.89459949f,
     0.89322430f,
     0.89184071f,
     0.89044872f,
     0.88904836f,
     0.88763962f,
     0.88622253f,
     0.88479710f,
     0.88336334f,
     0.88192126f,
     0.88047089f,
     0.87901223f,
     0.87754529f,
     0.87607009f,
     0.87458665f,
     0.87309498f,
     0.87159509f,
     0.87008699f,
     0.86857071f,
     0.86704625f,
     0.86551362f,
     0.86397286f,
     0.86242396f,
     0.86086694f,
     0.85930182f,
     0.85772861f,
     0.85614733f,
     0.85455799f,
     0.85296060f,
     0.85135519f,
     0.84974177f,
     0.84812034f,
     0.84649094f,
     0.84485357f,
     0.84320824f,
     0.84155498f,
     0.83989379f,
     0.83822471f,
     0.83654773f,
     0.83486287f,
     0.83317016f,
     0.83146961f,
     0.82976123f,
     0.82804505f,
     0.82632106f,
     0.82458930f,
     0.82284978f,
     0.82110251f,
     0.81934752f,
     0.81758481f,
     0.81581441f,
     0.81403633f,
     0.81225059f,
     0.81045720f,
     0.80865618f,
     0.80684755f,
     0.80503133f,
     0.80320753f,
     0.80137617f,
     0.79953727f,
     0.79769084f,
     0.79583690f,
     0.79397548f,
     0.79210658f,
     0.79023022f,
     0.78834643f,
     0.78645521f,
     0.78455660f,
     0.78265060f,
     0.78073723f,
     0.77881651f,
     0.77688847f,
     0.77495311f,
     0.77301045f,
     0.77106052f,
     0.76910334f,
     0.76713891f,
     0.76516727f,
     0.76318842f,
     0.76120239f,
     0.75920919f,
     0.75720885f,
     0.75520138f,
     0.75318680f,
     0.75116513f,
     0.74913639f,
     0.74710061f,
     0.74505779f,
     0.74300795f,
     0.74095113f,
     0.73888732f,
     0.73681657f,
     0.73473888f,
     0.73265427f,
     0.73056277f,
     0.72846439f,
     0.72635916f,
     0.72424708f,
     0.72212819f,
     0.72000251f,
     0.71787005f,
     0.71573083f,
     0.71358487f,
     0.71143220f,
     0.70927283f,
     0.70710678f,
     0.70493408f,
     0.70275474f,
     0.70056879f,
     0.69837625f,
     0.69617713f,
     0.69397146f,
     0.69175926f,
     0.68954054f,
     0.68731534f,
     0.68508367f,
     0.68284555f,
     0.68060100f,
     0.67835004f,
     0.67609270f,
     0.67382900f,
     0.67155895f,
     0.66928259f,
     0.66699992f,
     0.66471098f,
     0.66241578f,
     0.66011434f,
     0.65780669f,
     0.65549285f,
     0.65317284f,
     0.65084668f,
     0.64851440f,
     0.64617601f,
     0.64383154f,
     0.64148101f,
     0.63912444f,
     0.63676186f,
     0.63439328f,
     0.63201874f,
     0.62963824f,
     0.62725182f,
     0.62485949f,
     0.62246128f,
     0.62005721f,
     0.61764731f,
     0.61523159f,
     0.61281008f,
     0.61038281f,
     0.60794978f,
     0.60551104f,
     0.60306660f,
     0.60061648f,
     0.59816071f,
     0.59569930f,
     0.59323230f,
     0.59075970f,
     0.58828155f,
     0.58579786f,
     0.58330865f,
     0.58081396f,
     0.57831380f,
     0.57580819f,
     0.57329717f,
     0.57078075f,
     0.56825895f,
     0.56573181f,
     0.56319934f,
     0.56066158f,
     0.55811853f,
     0.55557023f,
     0.55301671f,
     0.55045797f,
     0.54789406f,
     0.54532499f,
     0.54275078f,
     0.54017147f,
     0.53758708f,
     0.53499762f,
     0.53240313f,
     0.52980362f,
     0.52719913f,
     0.52458968f,
     0.52197529f,
     0.51935599f,
     0.51673180f,
     0.51410274f,
     0.51146885f,
     0.50883014f,
     0.50618665f,
     0.50353838f,
     0.50088538f,
     0.49822767f,
     0.49556526f,
     0.49289819f,
     0.49022648f,
     0.48755016f,
     0.48486925f,
     0.48218377f,
     0.47949376f,
     0.47679923f,
     0.47410021f,
     0.47139674f,
     0.46868882f,
     0.46597650f,
     0.46325978f,
     0.46053871f,
     0.45781330f,
     0.45508359f,
     0.45234959f,
     0.44961133f,
     0.44686884f,
     0.44412214f,
     0.44137127f,
     0.43861624f,
     0.43585708f,
     0.43309382f,
     0.43032648f,
     0.42755509f,
     0.42477968f,
     0.42200027f,
     0.41921689f,
     0.41642956f,
     0.41363831f,
     0.41084317f,
     0.40804416f,
     0.40524131f,
     0.40243465f,
     0.39962420f,
     0.39680999f,
     0.39399204f,
     0.39117038f,
     0.38834505f,
     0.38551605f,
     0.38268343f,
     0.37984721f,
     0.37700741f,
     0.37416406f,
     0.37131719f,
     0.36846683f,
     0.36561300f,
     0.36275572f,
     0.35989504f,
     0.35703096f,
     0.35416353f,
     0.35129276f,
     0.34841868f,
     0.34554132f,
     0.34266072f,
     0.33977688f,
     0.33688985f,
     0.33399965f,
     0.33110631f,
     0.32820984f,
     0.32531029f,
     0.32240768f,
     0.31950203f,
     0.31659338f,
     0.31368174f,
     0.31076715f,
     0.30784964f,
     0.30492923f,
     0.30200595f,
     0.29907983f,
     0.29615089f,
     0.29321916f,
     0.29028468f,
     0.28734746f,
     0.28440754f,
     0.28146494f,
     0.27851969f,
     0.27557182f,
     0.27262136f,
     0.26966833f,
     0.26671276f,
     0.26375468f,
     0.26079412f,
     0.25783110f,
     0.25486566f,
     0.25189782f,
     0.24892761f,
     0.24595505f,
     0.24298018f,
     0.24000302f,
     0.23702361f,
     0.23404196f,
     0.23105811f,
     0.22807208f,
     0.22508391f,
     0.22209362f,
     0.21910124f,
     0.21610680f,
     0.21311032f,
     0.21011184f,
     0.20711138f,
     0.20410897f,
     0.20110463f,
     0.19809841f,
     0.19509032f,
     0.19208040f,
     0.18906866f,
     0.18605515f,
     0.18303989f,
     0.18002290f,
     0.17700422f,
     0.17398387f,
     0.17096189f,
     0.16793829f,
     0.16491312f,
     0.16188639f,
     0.15885814f,
     0.15582840f,
     0.15279719f,
     0.14976453f,
     0.14673047f,
     0.14369503f,
     0.14065824f,
     0.13762012f,
     0.13458071f,
     0.13154003f,
     0.12849811f,
     0.12545498f,
     0.12241068f,
     0.11936521f,
     0.11631863f,
     0.11327095f,
     0.11022221f,
     0.10717242f,
     0.10412163f,
     0.10106986f,
     0.09801714f,
     0.09496350f,
     0.09190896f,
     0.08885355f,
     0.08579731f,
     0.08274026f,
     0.07968244f,
     0.07662386f,
     0.07356456f,
     0.07050457f,
     0.06744392f,
     0.06438263f,
     0.06132074f,
     0.05825826f,
     0.05519524f,
     0.05213170f,
     0.04906767f,
     0.04600318f,
     0.04293826f,
     0.03987293f,
     0.03680722f,
     0.03374117f,
     0.03067480f,
     0.02760815f,
     0.02454123f,
     0.02147408f,
     0.01840673f,
     0.01533921f,
     0.01227154f,
     0.00920375f,
     0.00613588f,
     0.00306796f,
     0.00000000f,
    -0.00306796f,
    -0.00613588f,
    -0.00920375f,
    -0.01227154f,
    -0.01533921f,
    -0.01840673f,
    -0.02147408f,
    -0.02454123f,
    -0.02760815f,
    -0.03067480f,
    -0.03374117f,
    -0.03680722f,
    -0.03987293f,
    -0.04293826f,
    -0.04600318f,
    -0.04906767f,
    -0.05213170f,
    -0.05519524f,
    -0.05825826f,
    -0.06132074f,
    -0.06438263f,
    -0.06744392f,
    -0.07050457f,
    -0.07356456f,
    -0.07662386f,
    -0.07968244f,
    -0.08274026f,
    -0.08579731f,
    -0.08885355f,
    -0.09190896f,
    -0.09496350f,
    -0.09801714f,
    -0.10106986f,
    -0.10412163f,
    -0.10717242f,
    -0.11022221f,
    -0.11327095f,
    -0.11631863f,
    -0.11936521f,
    -0.12241068f,
    -0.12545498f,
    -0.12849811f,
    -0.13154003f,
    -0.13458071f,
    -0.13762012f,
    -0.14065824f,
    -0.14369503f,
    -0.14673047f,
    -0.14976453f,
    -0.15279719f,
    -0.15582840f,
    -0.15885814f,
    -0.16188639f,
    -0.16491312f,
    -0.16793829f,
    -0.17096189f,
    -0.17398387f,
    -0.17700422f,
    -0.18002290f,
    -0.18303989f,
    -0.18605515f,
    -0.18906866f,
    -0.19208040f,
    -0.19509032f,
    -0.19809841f,
    -0.20110463f,
    -0.20410897f,
    -0.20711138f,
    -0.21011184f,
    -0.21311032f,
    -0.21610680f,
    -0.21910124f,
    -0.22209362f,
    -0.22508391f,
    -0.22807208f,
    -0.23105811f,
    -0.23404196f,
    -0.23702361f,
    -0.24000302f,
    -0.24298018f,
    -0.24595505f,
    -0.24892761f,
    -0.25189782f,
    -0.25486566f,
    -0.25783110f,
    -0.26079412f,
    -0.26375468f,
    -0.26671276f,
    -0.26966833f,
    -0.27262136f,
    -0.27557182f,
    -0.27851969f,
    -0.28146494f,
    -0.28440754f,
    -0.28734746f,
    -0.29028468f,
    -0.29321916f,
    -0.29615089f,
    -0.29907983f,
    -0.30200595f,
    -0.30492923f,
    -0.30784964f,
    -0.31076715f,
    -0.31368174f,
    -0.31659338f,
    -0.31950203f,
    -0.32240768f,
    -0.32531029f,
    -0.32820984f,
    -0.33110631f,
    -0.33399965f,
    -0.33688985f,
    -0.33977688f,
    -0.34266072f,
    -0.34554132f,
    -0.34841868f,
    -0.35129276f,
    -0.35416353f,
    -0.35703096f,
    -0.35989504f,
    -0.36275572f,
    -0.36561300f,
    -0.36846683f,
    -0.37131719f,
    -0.37416406f,
    -0.37700741f,
    -0.37984721f,
    -0.38268343f,
    -0.38551605f,
    -0.38834505f,
    -0.39117038f,
    -0.39399204f,
    -0.39680999f,
    -0.39962420f,
    -0.40243465f,
    -0.40524131f,
    -0.40804416f,
    -0.41084317f,
    -0.41363831f,
    -0.41642956f,
    -0.41921689f,
    -0.42200027f,
    -0.42477968f,
    -0.42755509f,
    -0.43032648f,
    -0.43309382f,
    -0.43585708f,
    -0.43861624f,
    -0.44137127f,
    -0.44412214f,
    -0.44686884f,
    -0.44961133f,
    -0.45234959f,
    -0.45508359f,
    -0.45781330f,
    -0.46053871f,
    -0.46325978f,
    -0.46597650f,
    -0.46868882f,
    -0.47139674f,
    -0.47410021f,
    -0.47679923f,
    -0.47949376f,
    -0.48218377f,
    -0.48486925f,
    -0.48755016f,
    -0.49022648f,
    -0.49289819f,
    -0.49556526f,
    -0.49822767f,
    -0.50088538f,
    -0.50353838f,
    -0.50618665f,
    -0.50883014f,
    -0.51146885f,
    -0.51410274f,
    -0.51673180f,
    -0.51935599f,
    -0.52197529f,
    -0.52458968f,
    -0.52719913f,
    -0.52980362f,
    -0.53240313f,
    -0.53499762f,
    -0.53758708f,
    -0.54017147f,
    -0.54275078f,
    -0.54532499f,
    -0.54789406f,
    -0.55045797f,
    -0.55301671f,
    -0.55557023f,
    -0.55811853f,
    -0.56066158f,
    -0.56319934f,
    -0.56573181f,
    -0.56825895f,
    -0.57078075f,
    -0.57329717f,
    -0.57580819f,
    -0.57831380f,
    -0.58081396f,
    -0.58330865f,
    -0.58579786f,
    -0.58828155f,
    -0.59075970f,
    -0.59323230f,
    -0.59569930f,
    -0.59816071f,
    -0.60061648f,
    -0.60306660f,
    -0.60551104f,
    -0.60794978f,
    -0.61038281f,
    -0.61281008f,
    -0.61523159f,
    -0.61764731f,
    -0.62005721f,
    -0.62246128f,
    -0.62485949f,
    -0.62725182f,
    -0.62963824f,
    -0.63201874f,
    -0.63439328f,
    -0.63676186f,
    -0.63912444f,
    -0.64148101f,
    -0.64383154f,
    -0.64617601f,
    -0.64851440f,
    -0.65084668f,
    -0.65317284f,
    -0.65549285f,
    -0.65780669f,
    -0.66011434f,
    -0.66241578f,
    -0.66471098f,
    -0.66699992f,
    -0.66928259f,
    -0.67155895f,
    -0.67382900f,
    -0.67609270f,
    -0.67835004f,
    -0.68060100f,
    -0.68284555f,
    -0.68508367f,
    -0.68731534f,
    -0.68954054f,
    -0.69175926f,
    -0.69397146f,
    -0.69617713f,
    -0.69837625f,
    -0.70056879f,
    -0.70275474f,
    -0.70493408f,
    -0.70710678f,
    -0.70927283f,
    -0.71143220f,
    -0.71358487f,
    -0.71573083f,
    -0.71787005f,
    -0.72000251f,
    -0.72212819f,
    -0.72424708f,
    -0.72635916f,
    -0.72846439f,
    -0.73056277f,
    -0.73265427f,
    -0.73473888f,
    -0.73681657f,
    -0.73888732f,
    -0.74095113f,
    -0.74300795f,
    -0.74505779f,
    -0.74710061f,
    -0.74913639f,
    -0.75116513f,
    -0.75318680f,
    -0.75520138f,
    -0.75720885f,
    -0.75920919f,
    -0.76120239f,
    -0.76318842f,
    -0.76516727f,
    -0.76713891f,
    -0.76910334f,
    -0.77106052f,
    -0.77301045f,
    -0.77495311f,
    -0.77688847f,
    -0.77881651f,
    -0.78073723f,
    -0.78265060f,
    -0.78455660f,
    -0.78645521f,
    -0.78834643f,
    -0.79023022f,
    -0.79210658f,
    -0.79397548f,
    -0.79583690f,
    -0.79769084f,
    -0.79953727f,
    -0.80137617f,
    -0.80320753f,
    -0.80503133f,
    -0.80684755f,
    -0.80865618f,
    -0.81045720f,
    -0.81225059f,
    -0.81403633f,
    -0.81581441f,
    -0.81758481f,
    -0.81934752f,
    -0.82110251f,
    -0.82284978f,
    -0.82458930f,
    -0.82632106f,
    -0.82804505f,
    -0.82976123f,
    -0.83146961f,
    -0.83317016f,
    -0.83486287f,
    -0.83654773f,
    -0.83822471f,
    -0.83989379f,
    -0.84155498f,
    -0.84320824f,
    -0.84485357f,
    -0.84649094f,
    -0.84812034f,
    -0.84974177f,
    -0.85135519f,
    -0.85296060f,
    -0.85455799f,
    -0.85614733f,
    -0.85772861f,
    -0.85930182f,
    -0.86086694f,
    -0.86242396f,
    -0.86397286f,
    -0.86551362f,
    -0.86704625f,
    -0.86857071f,
    -0.87008699f,
    -0.87159509f,
    -0.87309498f,
    -0.87458665f,
    -0.87607009f,
    -0.87754529f,
    -0.87901223f,
    -0.88047089f,
    -0.88192126f,
    -0.88336334f,
    -0.88479710f,
    -0.88622253f,
    -0.88763962f,
    -0.88904836f,
    -0.89044872f,
    -0.89184071f,
    -0.89322430f,
    -0.89459949f,
    -0.89596625f,
    -0.89732458f,
    -0.89867447f,
    -0.90001589f,
    -0.90134885f,
    -0.90267332f,
    -0.90398929f,
    -0.90529676f,
    -0.90659570f,
    -0.90788612f,
    -0.90916798f,
    -0.91044129f,
    -0.91170603f,
    -0.91296219f,
    -0.91420976f,
    -0.91544872f,
    -0.91667906f,
    -0.91790078f,
    -0.91911385f,
    -0.92031828f,
    -0.92151404f,
    -0.92270113f,
    -0.92387953f,
    -0.92504924f,
    -0.92621024f,
    -0.92736253f,
    -0.92850608f,
    -0.92964090f,
    -0.93076696f,
    -0.93188427f,
    -0.93299280f,
    -0.93409255f,
    -0.93518351f,
    -0.93626567f,
    -0.93733901f,
    -0.93840353f,
    -0.93945922f,
    -0.94050607f,
    -0.94154407f,
    -0.94257320f,
    -0.94359346f,
    -0.94460484f,
    -0.94560733f,
    -0.94660091f,
    -0.94758559f,
    -0.94856135f,
    -0.94952818f,
    -0.95048607f,
    -0.95143502f,
    -0.95237501f,
    -0.95330604f,
    -0.95422810f,
    -0.95514117f,
    -0.95604525f,
    -0.95694034f,
    -0.95782641f,
    -0.95870347f,
    -0.95957151f,
    -0.96043052f,
    -0.96128049f,
    -0.96212140f,
    -0.96295327f,
    -0.96377607f,
    -0.96458979f,
    -0.96539444f,
    -0.96619000f,
    -0.96697647f,
    -0.96775384f,
    -0.96852209f,
    -0.96928124f,
    -0.97003125f,
    -0.97077214f,
    -0.97150389f,
    -0.97222650f,
    -0.97293995f,
    -0.97364425f,
    -0.97433938f,
    -0.97502535f,
    -0.97570213f,
    -0.97636973f,
    -0.97702814f,
    -0.97767736f,
    -0.97831737f,
    -0.97894818f,
    -0.97956977f,
    -0.98018214f,
    -0.98078528f,
    -0.98137919f,
    -0.98196387f,
    -0.98253930f,
    -0.98310549f,
    -0.98366242f,
    -0.98421009f,
    -0.98474850f,
    -0.98527764f,
    -0.98579751f,
    -0.98630810f,
    -0.98680940f,
    -0.98730142f,
    -0.98778414f,
    -0.98825757f,
    -0.98872169f,
    -0.98917651f,
    -0.98962202f,
    -0.99005821f,
    -0.99048508f,
    -0.99090264f,
    -0.99131086f,
    -0.99170975f,
    -0.99209931f,
    -0.99247953f,
    -0.99285041f,
    -0.99321195f,
    -0.99356414f,
    -0.99390697f,
    -0.99424045f,
    -0.99456457f,
    -0.99487933f,
    -0.99518473f,
    -0.99548076f,
    -0.99576741f,
    -0.99604470f,
    -0.99631261f,
    -0.99657115f,
    -0.99682030f,
    -0.99706007f,
    -0.99729046f,
    -0.99751146f,
    -0.99772307f,
    -0.99792529f,
    -0.99811811f,
    -0.99830154f,
    -0.99847558f,
    -0.99864022f,
    -0.99879546f,
    -0.99894129f,
    -0.99907773f,
    -0.99920476f,
    -0.99932238f,
    -0.99943060f,
    -0.99952942f,
    -0.99961882f,
    -0.99969882f,
    -0.99976941f,
    -0.99983058f,
    -0.99988235f,
    -0.99992470f,
    -0.99995764f,
    -0.99998118f,
    -0.99999529f,
    -1.00000000f,
    -0.99999529f,
    -0.99998118f,
    -0.99995764f,
    -0.99992470f,
    -0.99988235f,
    -0.99983058f,
    -0.99976941f,
    -0.99969882f,
    -0.99961882f,
    -0.99952942f,
    -0.99943060f,
    -0.99932238f,
    -0.99920476f,
    -0.99907773f,
    -0.99894129f,
    -0.99879546f,
    -0.99864022f,
    -0.99847558f,
    -0.99830154f,
    -0.99811811f,
    -0.99792529f,
    -0.99772307f,
    -0.99751146f,
    -0.99729046f,
    -0.99706007f,
    -0.99682030f,
    -0.99657115f,
    -0.99631261f,
    -0.99604470f,
    -0.99576741f,
    -0.99548076f,
    -0.99518473f,
    -0.99487933f,
    -0.99456457f,
    -0.99424045f,
    -0.99390697f,
    -0.99356414f,
    -0.99321195f,
    -0.99285041f,
    -0.99247953f,
    -0.99209931f,
    -0.99170975f,
    -0.99131086f,
    -0.99090264f,
    -0.99048508f,
    -0.99005821f,
    -0.98962202f,
    -0.98917651f,
    -0.98872169f,
    -0.98825757f,
    -0.98778414f,
    -0.98730142f,
    -0.98680940f,
    -0.98630810f,
    -0.98579751f,
    -0.98527764f,
    -0.98474850f,
    -0.98421009f,
    -0.98366242f,
    -0.98310549f,
    -0.98253930f,
    -0.98196387f,
    -0.98137919f,
    -0.98078528f,
    -0.98018214f,
    -0.97956977f,
    -0.97894818f,
    -0.97831737f,
    -0.97767736f,
    -0.97702814f,
    -0.97636973f,
    -0.97570213f,
    -0.97502535f,
    -0.97433938f,
    -0.97364425f,
    -0.97293995f,
    -0.97222650f,
    -0.97150389f,
    -0.97077214f,
    -0.97003125f,
    -0.96928124f,
    -0.96852209f,
    -0.96775384f,
    -0.96697647f,
    -0.96619000f,
    -0.96539444f,
    -0.96458979f,
    -0.96377607f,
    -0.96295327f,
    -0.96212140f,
    -0.96128049f,
    -0.96043052f,
    -0.95957151f,
    -0.95870347f,
    -0.95782641f,
    -0.95694034f,
    -0.95604525f,
    -0.95514117f,
    -0.95422810f,
    -0.95330604f,
    -0.95237501f,
    -0.95143502f,
    -0.95048607f,
    -0.94952818f,
    -0.94856135f,
    -0.94758559f,
    -0.94660091f,
    -0.94560733f,
    -0.94460484f,
    -0.94359346f,
    -0.94257320f,
    -0.94154407f,
    -0.94050607f,
    -0.93945922f,
    -0.93840353f,
    -0.93733901f,
    -0.93626567f,
    -0.93518351f,
    -0.93409255f,
    -0.93299280f,
    -0.93188427f,
    -0.93076696f,
    -0.92964090f,
    -0.92850608f,
    -0.92736253f,
    -0.92621024f,
    -0.92504924f,
    -0.92387953f,
    -0.92270113f,
    -0.92151404f,
    -0.92031828f,
    -0.91911385f,
    -0.91790078f,
    -0.91667906f,
    -0.91544872f,
    -0.91420976f,
    -0.91296219f,
    -0.91170603f,
    -0.91044129f,
    -0.90916798f,
    -0.90788612f,
    -0.90659570f,
    -0.90529676f,
    -0.90398929f,
    -0.90267332f,
    -0.90134885f,
    -0.90001589f,
    -0.89867447f,
    -0.89732458f,
    -0.89596625f,
    -0.89459949f,
    -0.89322430f,
    -0.89184071f,
    -0.89044872f,
    -0.88904836f,
    -0.88763962f,
    -0.88622253f,
    -0.88479710f,
    -0.88336334f,
    -0.88192126f,
    -0.88047089f,
    -0.87901223f,
    -0.87754529f,
    -0.87607009f,
    -0.87458665f,
    -0.87309498f,
    -0.87159509f,
    -0.87008699f,
    -0.86857071f,
    -0.86704625f,
    -0.86551362f,
    -0.86397286f,
    -0.86242396f,
    -0.86086694f,
    -0.85930182f,
    -0.85772861f,
    -0.85614733f,
    -0.85455799f,
    -0.85296060f,
    -0.85135519f,
    -0.84974177f,
    -0.84812034f,
    -0.84649094f,
    -0.84485357f,
    -0.84320824f,
    -0.84155498f,
    -0.83989379f,
    -0.83822471f,
    -0.83654773f,
    -0.83486287f,
    -0.83317016f,
    -0.83146961f,
    -0.82976123f,
    -0.82804505f,
    -0.82632106f,
    -0.82458930f,
    -0.82284978f,
    -0.82110251f,
    -0.81934752f,
    -0.81758481f,
    -0.81581441f,
    -0.81403633f,
    -0.81225059f,
    -0.81045720f,
    -0.80865618f,
    -0.80684755f,
    -0.80503133f,
    -0.80320753f,
    -0.80137617f,
    -0.79953727f,
    -0.79769084f,
    -0.79583690f,
    -0.79397548f,
    -0.79210658f,
    -0.79023022f,
    -0.78834643f,
    -0.78645521f,
    -0.78455660f,
    -0.78265060f,
    -0.78073723f,
    -0.77881651f,
    -0.77688847f,
    -0.77495311f,
    -0.77301045f,
    -0.77106052f,
    -0.76910334f,
    -0.76713891f,
    -0.76516727f,
    -0.76318842f,
    -0.76120239f,
    -0.75920919f,
    -0.75720885f,
    -0.75520138f,
    -0.75318680f,
    -0.75116513f,
    -0.74913639f,
    -0.74710061f,
    -0.74505779f,
    -0.74300795f,
    -0.74095113f,
    -0.73888732f,
    -0.73681657f,
    -0.73473888f,
    -0.73265427f,
    -0.73056277f,
    -0.72846439f,
    -0.72635916f,
    -0.72424708f,
    -0.72212819f,
    -0.72000251f,
    -0.71787005f,
    -0.71573083f,
    -0.71358487f,
    -0.71143220f,
    -0.70927283f,
    -0.70710678f,
    -0.70493408f,
    -0.70275474f,
    -0.70056879f,
    -0.69837625f,
    -0.69617713f,
    -0.69397146f,
    -0.69175926f,
    -0.68954054f,
    -0.68731534f,
    -0.68508367f,
    -0.68284555f,
    -0.68060100f,
    -0.67835004f,
    -0.67609270f,
    -0.67382900f,
    -0.67155895f,
    -0.66928259f,
    -0.66699992f,
    -0.66471098f,
    -0.66241578f,
    -0.66011434f,
    -0.65780669f,
    -0.65549285f,
    -0.65317284f,
    -0.65084668f,
    -0.64851440f,
    -0.64617601f,
    -0.64383154f,
    -0.64148101f,
    -0.63912444f,
    -0.63676186f,
    -0.63439328f,
    -0.63201874f,
    -0.62963824f,
    -0.62725182f,
    -0.62485949f,
    -0.62246128f,
    -0.62005721f,
    -0.61764731f,
    -0.61523159f,
    -0.61281008f,
    -0.61038281f,
    -0.60794978f,
    -0.60551104f,
    -0.60306660f,
    -0.60061648f,
    -0.59816071f,
    -0.59569930f,
    -0.59323230f,
    -0.59075970f,
    -0.58828155f,
    -0.58579786f,
    -0.58330865f,
    -0.58081396f,
    -0.57831380f,
    -0.57580819f,
    -0.57329717f,
    -0.57078075f,
    -0.56825895f,
    -0.56573181f,
    -0.56319934f,
    -0.56066158f,
    -0.55811853f,
    -0.55557023f,
    -0.55301671f,
    -0.55045797f,
    -0.54789406f,
    -0.54532499f,
    -0.54275078f,
    -0.54017147f,
    -0.53758708f,
    -0.53499762f,
    -0.53240313f,
    -0.52980362f,
    -0.52719913f,
    -0.52458968f,
    -0.52197529f,
    -0.51935599f,
    -0.51673180f,
    -0.51410274f,
    -0.51146885f,
    -0.50883014f,
    -0.50618665f,
    -0.50353838f,
    -0.50088538f,
    -0.49822767f,
    -0.49556526f,
    -0.49289819f,
    -0.49022648f,
    -0.48755016f,
    -0.48486925f,
    -0.48218377f,
    -0.47949376f,
    -0.47679923f,
    -0.47410021f,
    -0.47139674f,
    -0.46868882f,
    -0.46597650f,
    -0.46325978f,
    -0.46053871f,
    -0.45781330f,
    -0.45508359f,
    -0.45234959f,
    -0.44961133f,
    -0.44686884f,
    -0.44412214f,
    -0.44137127f,
    -0.43861624f,
    -0.43585708f,
    -0.43309382f,
    -0.43032648f,
    -0.42755509f,
    -0.42477968f,
    -0.42200027f,
    -0.41921689f,
    -0.41642956f,
    -0.41363831f,
    -0.41084317f,
    -0.40804416f,
    -0.40524131f,
    -0.40243465f,
    -0.39962420f,
    -0.39680999f,
    -0.39399204f,
    -0.39117038f,
    -0.38834505f,
    -0.38551605f,
    -0.38268343f,
    -0.37984721f,
    -0.37700741f,
    -0.37416406f,
    -0.37131719f,
    -0.36846683f,
    -0.36561300f,
    -0.36275572f,
    -0.35989504f,
    -0.35703096f,
    -0.35416353f,
    -0.35129276f,
    -0.34841868f,
    -0.34554132f,
    -0.34266072f,
    -0.33977688f,
    -0.33688985f,
    -0.33399965f,
    -0.33110631f,
    -0.32820984f,
    -0.32531029f,
    -0.32240768f,
    -0.31950203f,
    -0.31659338f,
    -0.31368174f,
    -0.31076715f,
    -0.30784964f,
    -0.30492923f,
    -0.30200595f,
    -0.29907983f,
    -0.29615089f,
    -0.29321916f,
    -0.29028468f,
    -0.28734746f,
    -0.28440754f,
    -0.28146494f,
    -0.27851969f,
    -0.27557182f,
    -0.27262136f,
    -0.26966833f,
    -0.26671276f,
    -0.26375468f,
    -0.26079412f,
    -0.25783110f,
    -0.25486566f,
    -0.25189782f,
    -0.24892761f,
    -0.24595505f,
    -0.24298018f,
    -0.24000302f,
    -0.23702361f,
    -0.23404196f,
    -0.23105811f,
    -0.22807208f,
    -0.22508391f,
    -0.22209362f,
    -0.21910124f,
    -0.21610680f,
    -0.21311032f,
    -0.21011184f,
    -0.20711138f,
    -0.20410897f,
    -0.20110463f,
    -0.19809841f,
    -0.19509032f,
    -0.19208040f,
    -0.18906866f,
    -0.18605515f,
    -0.18303989f,
    -0.18002290f,
    -0.17700422f,
    -0.17398387f,
    -0.17096189f,
    -0.16793829f,
    -0.16491312f,
    -0.16188639f,
    -0.15885814f,
    -0.15582840f,
    -0.15279719f,
    -0.14976453f,
    -0.14673047f,
    -0.14369503f,
    -0.14065824f,
    -0.13762012f,
    -0.13458071f,
    -0.13154003f,
    -0.12849811f,
    -0.12545498f,
    -0.12241068f,
    -0.11936521f,
    -0.11631863f,
    -0.11327095f,
    -0.11022221f,
    -0.10717242f,
    -0.10412163f,
    -0.10106986f,
    -0.09801714f,
    -0.09496350f,
    -0.09190896f,
    -0.08885355f,
    -0.08579731f,
    -0.08274026f,
    -0.07968244f,
    -0.07662386f,
    -0.07356456f,
    -0.07050457f,
    -0.06744392f,
    -0.06438263f,
    -0.06132074f,
    -0.05825826f,
    -0.05519524f,
    -0.05213170f,
    -0.04906767f,
    -0.04600318f,
    -0.04293826f,
    -0.03987293f,
    -0.03680722f,
    -0.03374117f,
    -0.03067480f,
    -0.02760815f,
    -0.02454123f,
    -0.02147408f,
    -0.01840673f,
    -0.01533921f,
    -0.01227154f,
    -0.00920375f,
    -0.00613588f,
    -0.00306796f
};

SPAN_DECLARE(float) dds_phase_to_radians(uint32_t phase)
{
    return phase*2.0f*3.1415926f/(65536.0f*65536.0f);
}
/*- End of function --------------------------------------------------------*/

SPAN_DECLARE(int32_t) dds_phase_ratef(float frequency)
{
    return (int32_t) (frequency*65536.0f*65536.0f/SAMPLE_RATE);
}
/*- End of function --------------------------------------------------------*/

SPAN_DECLARE(float) dds_frequencyf(int32_t phase_rate)
{
    return (float) phase_rate*(float) SAMPLE_RATE/(65536.0f*65536.0f);
}
/*- End of function --------------------------------------------------------*/

SPAN_DECLARE(float) dds_scaling_dbm0f(float level)
{
    return db_to_amplitude_ratio(level - DBM0_MAX_SINE_POWER)*32767.0f;
}
/*- End of function --------------------------------------------------------*/

SPAN_DECLARE(float) dds_scaling_dbovf(float level)
{
    return db_to_amplitude_ratio(level - DBOV_MAX_SINE_POWER)*32767.0f;
}
/*- End of function --------------------------------------------------------*/

static __inline__ float dds_lookupx(uint32_t phase)
{
    return sine_table[phase >> (32 - SLENK)];
}
/*- End of function --------------------------------------------------------*/

SPAN_DECLARE(float) dds_lookupf(uint32_t phase)
{
    return dds_lookupx(phase);
}
/*- End of function --------------------------------------------------------*/

SPAN_DECLARE(float) dds_offsetf(uint32_t phase_acc, int32_t phase_offset)
{
    return dds_lookupx(phase_acc + phase_offset);
}
/*- End of function --------------------------------------------------------*/

SPAN_DECLARE(void) dds_advancef(uint32_t *phase_acc, int32_t phase_rate)
{
    *phase_acc += phase_rate;
}
/*- End of function --------------------------------------------------------*/

SPAN_DECLARE(float) ddsf(uint32_t *phase_acc, int32_t phase_rate)
{
    float amp;

    amp = dds_lookupx(*phase_acc);
    *phase_acc += phase_rate;
    return amp;
}
/*- End of function --------------------------------------------------------*/

SPAN_DECLARE(float) dds_modf(uint32_t *phase_acc, int32_t phase_rate, float scale, int32_t phase)
{
    float amp;

    amp = dds_lookupx(*phase_acc + phase)*scale;
    *phase_acc += phase_rate;
    return amp;
}
/*- End of function --------------------------------------------------------*/

SPAN_DECLARE(complexf_t) dds_lookup_complexf(uint32_t phase)
{
    return complex_setf(dds_lookupx(phase + (1 << 30)), dds_lookupx(phase));
}
/*- End of function --------------------------------------------------------*/

SPAN_DECLARE(complexf_t) dds_complexf(uint32_t *phase_acc, int32_t phase_rate)
{
    complexf_t amp;

    amp = complex_setf(dds_lookupx(*phase_acc + (1 << 30)), dds_lookupx(*phase_acc));
    *phase_acc += phase_rate;
    return amp;
}
/*- End of function --------------------------------------------------------*/

SPAN_DECLARE(complexf_t) dds_complex_modf(uint32_t *phase_acc, int32_t phase_rate, float scale, int32_t phase)
{
    complexf_t amp;

    amp = complex_setf(dds_lookupx(*phase_acc + phase + (1 << 30))*scale,
                       dds_lookupx(*phase_acc + phase)*scale);
    *phase_acc += phase_rate;
    return amp;
}
/*- End of function --------------------------------------------------------*/
/*- End of file ------------------------------------------------------------*/
